/*
 * fifo.c
 *
 *  Created on: 2016年6月30日
 *      Author: pengzhikang
 */

#include "fifo.h"
#define FLAGS_OVERRUN 0x0001

/**
 *  缓冲区初始化函数
 * 初始化缓冲区结构体fifo, size表示缓冲区大小, buf表示缓冲区地址
 */
void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task) {
	fifo->size = size;
	fifo->buf = buf;
	fifo->free = size; //剩余空间
	fifo->flags = 0;
	fifo->p = 0; //写入位置
	fifo->q = 0; //读取位置
	fifo->task = task; //有数据写入时需要唤醒的任务
	return;
}

/**
 * 向缓冲区结构体fifo中的缓冲区写入数据data
 */
int fifo32_put(struct FIFO32 *fifo, int data) {
	if (fifo->free == 0) {
		fifo->flags |= FLAGS_OVERRUN;
		return -1;
	}
	fifo->buf[fifo->p] = data;
	fifo->p++;
	if (fifo->p == fifo->size) {
		fifo->p = 0;
	}
	fifo->free--;
	if (fifo->task != 0) {
		if (fifo->task->flags != TASK_ACTIVITY) { // 如果任务处于休眠状态
			task_run(fifo->task, -1, 0); // 将任务唤醒
		}
	}
	return 0;
}

/**
 * 读取缓冲区结构体fifo中的缓冲区的一个字节数据
 *	并作为函数返回值返回给调用者
 */
int fifo32_get(struct FIFO32 *fifo) {
	int data;
	if (fifo->free == fifo->size) {
		return -1;
	}
	data = fifo->buf[fifo->q];
	fifo->q++;
	if (fifo->q == fifo->size) {
		fifo->q = 0;
	}
	fifo->free++;
	return data;
}

/**
 * 返回缓冲区结构体fifo中的缓冲区中共有多少字节的数据
 */
int fifo32_status(struct FIFO32 *fifo) {
	return fifo->size - fifo->free;
}

